package com.cqwu.dao.impl;

import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.cqwu.dao.BaseDao;

/**
 * @author LK
 * @time   2015-11-21 上午10:07:03
 * @param  <T>
 */
public class BaseDaoImpl<T> implements BaseDao<T>{

	@Autowired
	@Qualifier("hibernateTemplate")
	public HibernateTemplate hibernateTemplate;

	/*
	 * 查询操作
	 */
	public T get(Class<T> entryClass, Serializable id) {
		return hibernateTemplate.get(entryClass, id);
	}

	/*
	 * 保存操作
	 */
	public Serializable save(T entity) {
		return hibernateTemplate.save(entity);
	}
	/*
	 * 更新操作
	 */
	public void update(T entity) {
		//entry有ID就update 否则save
		hibernateTemplate.saveOrUpdate(entity);
	}
	/*
	 * 删除操作
	 */
	public void delete(T entity) {
		hibernateTemplate.delete(entity);
	}
	/*
	 * 删除操作
	 */
	public void delete(Class<T> entityClazz, Serializable id) {
		String hql = "delete "+ entityClazz.getSimpleName() + " en where en.id = ?"; 
		hibernateTemplate.getSessionFactory().getCurrentSession()
			.createQuery(hql).setParameter("0", id)
			.executeUpdate();
	}
	/*
	 * 获取所有实体
	 */
	public List<T> findALl(Class<T> entityClazz) {
		return find("from "+entityClazz.getSimpleName());
	}
	/*
	 * 获取表记录数
	 */
	public long findCount(Class<T> entityClazz) {
		return (Long) hibernateTemplate.getSessionFactory().getCurrentSession()
				.createQuery("select count(*) from "+entityClazz.getSimpleName())
				.uniqueResult();
	}
	/*
	 * 查询操作
	 */
	@SuppressWarnings("unchecked")
	protected List<T> find(String hql) {
		return (List<T>) hibernateTemplate.getSessionFactory().getCurrentSession()
				.createQuery(hql).list();
	}
	
	//根据带占位参数的HQL语句 查询实体
	@SuppressWarnings("unchecked")
	protected List<T> find(String hql,Object... params){
		//创建查询
		Query query = hibernateTemplate.getSessionFactory().getCurrentSession()
				.createQuery(hql);
		//为包含占位符的gel语句设置参数
		for(int i = 0, len = params.length; i < len; i++){
			query.setParameter(i+"", params[i]);
		}
		return query.list();
	}
	
	//使用hql进行分页查询
	@SuppressWarnings("unchecked")
	protected List<T> findByPage(String hql,int pageNo,int pageSize){
		return  hibernateTemplate.getSessionFactory().getCurrentSession()
				.createQuery(hql).setFirstResult((pageNo - 1) * pageSize)
				.setMaxResults(pageSize).list();
	}
		
	//hql 分页查询
	@SuppressWarnings("unchecked")
	protected List<T> findByPage(String hql,int pageNo,int pageSize,Object...params ){
		Query query = hibernateTemplate.getSessionFactory().getCurrentSession().createQuery(hql);
		//设置参数
		for(int i = 0, len = params.length ; i < len ; i++){
			query.setParameter(i+"", params[i]);
		}
		//执行查询
		return query.setFirstResult((pageNo - 1) * pageSize)
				.setMaxResults(pageSize)
				.list();
	}
	
}
